草庐IT

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

全部标签

c++ - constexpr 求值分支/constexpr 重载

设置:我有一个使用SIMD内部函数的函数,我想在一些constexpr函数中使用它。为此,我需要将其设为constexpr。但是,SIMD内在函数没有标记为constexpr,编译器的常量求值器无法处理它们。我尝试用执行相同操作的C++constexpr实现替换SIMD内在函数。该函数在运行时变慢了3.5倍,但我能够在编译时使用它(是吗?)。问题:如何在常量表达式中使用这个函数而不减慢我的程序在运行时的速度?一些想法:为编译器常量表达式求值器添加对所有SIMD内在函数的常量求值支持,适用于所有编译器:可能是正确的解决方案,但却是一项不可能完成的艰巨任务。更务实的解决方案是:根据函数是否

c++ - 提供给 std::unique_ptr 的简单自定义删除器 lambda:为什么使用引用捕获默认值 ([&]) 而不是非捕获 ([])?

背景Cppreference:ssectiononstd::unique_ptr显示以下演示,用于向unique_ptr提供自定义删除器实例:std::unique_ptr>p(newD,[&](D*ptr){std::cout在哪里D,就这个问题而言,就像简单的自定义类型一样,比如structD{D(){std::cout此外,上面的引用说明了删除器的以下类型要求:TyperequirementsDeletermustbeFunctionObjectorlvaluereferencetoaFunctionObjectorlvaluereferencetofunction,callab

c++ - 使用 constexpr 函数时推导失败?

所以我正在根据thisquestion做进一步的测试,我仍然不太清楚类型推导的工作原理。如果我使用以下内容:template::value,int>=0>inlineautofnx(T)->int{return0;}template::value,int>=0>inlineautofnx(T)->int{return0;}inlinevoidfn(){fnx(1);fnx(1.f);}我没有得到任何编译错误。但是当我这样做时:templateconstexprboolvalue(){returnTRUTH;}template::value>(),int>=0>inlineautofnx

c++ - 为什么 float 和 int 的 std::pow 会调用此重载?

以下内容:#includeintmain(){floatbase=2.0f;floatresult=std::pow(base,2);return0;}在打开时触发-Wconversion警告。Wandbox似乎调用了std::pow的double重载,我希望选择float重载(与int指数被转换为float)。知道他重载的人能解释一下为什么吗? 最佳答案 自C++11起,混合参数pow将任何整数参数强制转换为double。混合参数函数的返回类型始终是double除非一个参数是longdouble然后结果是longdouble。[c

c++14 unique_ptr 并使 unique_ptr 错误使用已删除函数 'std::unique-ptr'

我有这样的功能..unique_ptrtest(unique_ptr&&node,stringkey){if(!node){returnmake_unique(key);}elsereturnnode;}如果节点为空,我想创建一个节点,或者返回节点。但它错误地说“使用已删除的函数'std::unique_ptr'”。我做错了什么? 最佳答案 问题在于您调用函数的方式。但首先你应该按值接受你的std::unique_ptr,而不是r-reference。然后你需要在调用函数时std::move()你的指针://acceptbyvalu

C++ 在 ‘value_type’ 中没有名为 ‘struct std::iterator_traits<int>' 的类型

你好。我正在尝试运行以下代码(仅用于培训目的):#include#includetemplate>classkont>typenamestd::iterator_traits::value_typefoo_test(typenamekont::iteratorb){return*b;}templatetypenamestd::iterator_traits::value_typeminimum(Iterb,Itere){Iterm=b;/*CODE*/return*m;}intmain(void){std::listx;x.push_back(10);x.push_back(100);

c++ - 对非常量对象的 constexpr 引用

是否允许将非常量引用声明为constexpr?示例代码:intx=1;constexprint&r=x;这被gcc和clang接受(我尝试了这两个的几个当前和过去的版本,回到C++11,并且都接受了)。但是我认为它不应该被接受,因为C++14[dcl.constexpr/9]说:ifaconstexprspecifierisusedinareferencedeclaration,everyfull-expressionthatappearsinitsinitializershallbeaconstantexpressionandx不是常量表达式。[dcl.constexpr]的最新C+

c++ - 如何跨多个文件声明全局 std::vector 二维数组? C++

我有一个头文件,其中有一个二维数组外部声明,还有一个cpp文件,其中有数组的实际定义,供它链接到。我想用二维vector替换这个数组,但我的编译器一直告诉我:'A':redefinition;multipleinitialization这是我的代码标题.h#ifndefHEADERS_H_DECLARED#defineHEADERS_H_DECLARED#include...externstd::vector>A(10,std::vector(10));...#endifA.cpp#include"headers.h"...std::vector>A(10,std::vector(10

c++ - 我们应该如何在函数中使用带有 std::accumulate 的模板来通过考虑模板而不是 "init"来返回正确的类型

std::accumulate的返回类型取决于“init”,即如果它是整数,它将返回整数,如果是double,它将返回double。我有一个像这样求和的模板函数:Tmean(std::vectorvector){Tsum=std::accumulate(vector.begin(),vector.end(),X);}我应该用什么代替X? 最佳答案 您可以只使用T{},它是默认构造的T。例如Tsum=std::accumulate(vector.begin(),vector.end(),T{});如果你需要用一些初始值来初始化它,你可

c++ - 如何在 Qt Creator 中更改/配置所需的编译器?即在 MSVC/Mingw 或 g++/clang++ 之间切换

我知道howtoaddcompilerinQtCreator.但是我的Qt总是选择MSVC编译器。如何设置MinGW(内置或外置)而不是MSVC?找不到任何帖子可以帮助新手了解如何更改所需偏好的编译器。我当前的系统是Windows,但是也欢迎提供有关Linux(g++clang++)的信息。 最佳答案 以下是Qt5.9的方式:在配置新项目时,只选择那些需要的编译器/工具包;对于64位系统,获取latestMinGW并安装在合适的路径上;安装MinGW64时,您可以选择“posixthreads”,而不是“win32threads”以